package mj.scott.common.utils;

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class WxQrCodeUtil {
    // 微信接口地址
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
    private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s";

    // 获取access_token（有效期2小时，需缓存）
    public static String getAccessToken(String appid, String secret) {
        RestTemplate restTemplate = new RestTemplate();
        String url = String.format(ACCESS_TOKEN_URL, appid, secret);
        Map<String, Object> result = restTemplate.getForObject(url, Map.class);
        return result.get("access_token").toString();
    }

    // 生成小程序码（参数scene为桌号ID，如"table:1"）
    // 修改WxQrCodeUtil.generateWxQrCode方法，增加错误处理
    public static byte[] generateWxQrCode(String appid, String secret, String scene) {
        try {
            String accessToken = getAccessToken(appid, secret);
            String url = String.format(QR_CODE_URL, accessToken);

            // 请求参数（关键：page必须与小程序app.json中的路径一致）
            Map<String, Object> params = new HashMap<>();
            params.put("scene", scene);  // 桌号参数
            // 重点：修改为你的小程序实际首页路径（必须存在于app.json的pages中）
            params.put("page", "pages/index/index");  // 例如小程序首页是pages/index/index
            params.put("width", 430);

            RestTemplate restTemplate = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<Map> entity = new HttpEntity<>(params, headers);

            ResponseEntity<byte[]> response = restTemplate.exchange(
                    url, HttpMethod.POST, entity, byte[].class);

            // 验证返回的是否是图片
            if (response.getHeaders().getContentType() != null
                    && response.getHeaders().getContentType().toString().contains("image")) {
                return response.getBody();
            } else {
                String errorMsg = new String(response.getBody(), StandardCharsets.UTF_8);
                throw new RuntimeException("生成小程序码失败：" + errorMsg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}